home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Peter Lewis / Finger 1.3.5 / source / Finger / Preferences.p < prev   
Encoding:
Text File  |  1992-02-24  |  7.2 KB  |  331 lines  |  [TEXT/PJMM]

  1. unit Preferences;
  2.  
  3. { This code is part of the Finger/Fingerd source code, written in THINK Pascal 4 }
  4. { Copyright 1991-1992 Peter N Lewis }
  5. { If you use this code, you must give me credit in your about box and documentation }
  6.  
  7. interface
  8.  
  9.     uses
  10.         MyTypes, MyUtils, MyUtilities, MyFileSystem, MyStandardFile, Folders, MySystem7,{}
  11.         BaseGlobals, AppGlobals, OOMainLoop, MyFMenus, PrefsGlobals, MyPreferences;
  12.  
  13.     procedure InitPreferences;
  14.     function FinishPreferences: boolean;
  15.     procedure GetPreferences (wdrn: integer; dirID: longInt; name: str63);  { used for ODoc/Params }
  16.     procedure OpenPreferences;
  17.  
  18. implementation
  19.  
  20.     const
  21.         Pref_Save_item = 1;
  22.         Pref_Default_Item = Pref_Save_item;  { Must be one anyway, since we use OutlineDefault1 }
  23.         Pref_Cancel_item = 2;
  24.         Pref_OK_item = 3;
  25.  
  26.         User_item = 4;
  27.         PFS_item = 5;
  28.         PFB_item = 6;
  29.         IPS_item = 7;
  30.         AFS_item = 8;
  31.  
  32.     type
  33.         PrefsObject = object(DObject)
  34.                 procedure Create (id: integer);
  35.                 override;
  36.                 procedure Destroy;
  37.                 override;
  38.                 procedure DoClose;
  39.                 override;
  40.                 procedure DoItem (item: integer);
  41.                 override;
  42.             end;
  43.  
  44.     var
  45.         noAlert: boolean;
  46.         prefs_fs: FSSpec;
  47.         dialog_prefs: prefsRecord;
  48.         prefs_dialog_dirty: boolean;
  49.         prefs_object: PrefsObject;
  50.  
  51.     procedure SetDialog (dp: dialogPtr);
  52.     forward;
  53.  
  54. {$S}
  55.     procedure SetPrefsMenu (themenu, theitem: integer);
  56.     begin
  57.         SetIDItemEnable(themenu, theitem, not IsWObjectFront(prefs_object));
  58.     end;
  59.  
  60. {$S Init}
  61.     procedure InitPreferences;
  62.     begin
  63.         prefs_object := nil;
  64.         noAlert := false;
  65.         GetPrefsFSSpec(prefs_fs);
  66.         JustGetPrefs(prefs);
  67.         SetFBoth(Cpreferences, @OpenPreferences, @SetPrefsMenu);
  68.     end;
  69.  
  70. {$S PrefInit}
  71.     procedure GetPreferences (wdrn: integer; dirID: longInt; name: str63);
  72.         var
  73.             oe: OSErr;
  74.             a: integer;
  75.             prefs_rn: integer;
  76.     begin
  77.         oe := MyResolveAliasFile(wdrn, dirID, name);
  78.         prefs_fs.vRefNum := wdrn;
  79.         prefs_fs.parID := dirID;
  80.         prefs_fs.name := name;
  81.         prefs_rn := OpenPrefsFile(prefs_fs);
  82.         if prefs_rn <> -1 then begin
  83.             GetPrefs(prefs);
  84.             CloseResFile(prefs_rn);
  85.             if prefs_object <> nil then
  86.                 SetDialog(prefs_object.window);
  87.         end
  88.         else if not noAlert then
  89.             a := Alert(pref_read_alert_id, nil);
  90.     end;
  91.  
  92. {$S Prefs}
  93.     procedure SaveDefaults;
  94.         var
  95.             oe: OSErr;
  96.             a: integer;
  97.             name: str63;
  98.             crdate: longInt;
  99.     begin
  100.         with prefs do begin
  101.             if plan_dirID = -1 then
  102.                 oe := myErr
  103.             else begin
  104.                 name := '';
  105.                 oe := GetVolInfo(name, plan_vrn, -1, crdate);
  106.             end;
  107.             if oe = noErr then
  108.                 if not MFSExists(plan_vrn, plan_dirID, plan_name) then
  109.                     oe := myErr;
  110.             if oe = noErr then begin
  111.                 plan_volume := name;
  112.                 plan_CrDate := crdate;
  113.             end
  114.             else begin
  115.                 plan_enabled := false;
  116.                 plan_DirID := -1;
  117.                 plan_CrDate := 0;
  118.                 plan_Volume := '';
  119.             end;
  120.         end;
  121.         JustSetPrefs(prefs);
  122.     end;
  123.  
  124. {$S Term}
  125.     function FinishPreferences: boolean;
  126.     begin
  127.         if prefs_object <> nil then
  128.             prefs_object.DoClose;
  129.         FinishPreferences := prefs_object <> nil;
  130.     end;
  131.  
  132. {$S Prefs}
  133.     function GetControl (dp: dialogPtr; item: integer): boolean;
  134.         var
  135.             kind: integer;
  136.             r: rect;
  137.             h: controlHandle;
  138.     begin
  139.         GetDItem(dp, item, kind, handle(h), r);
  140.         GetControl := GetCtlValue(h) <> 0;
  141.     end;
  142.  
  143. {$S Prefs}
  144.     procedure SetControl (dp: dialogPtr; item: integer; on: boolean);
  145.         var
  146.             kind: integer;
  147.             r: rect;
  148.             h: controlHandle;
  149.     begin
  150.         GetDItem(dp, item, kind, handle(h), r);
  151.         SetCtlValue(h, ord(on));
  152.         prefs_dialog_dirty := true;
  153.     end;
  154.  
  155. {$S Prefs}
  156.     procedure SetControls (dp: dialogPtr; first, count, value: integer);
  157.         var
  158.             i: integer;
  159.     begin
  160.         for i := 0 to count - 1 do
  161.             SetControl(dp, first + i, i = value);
  162.     end;
  163.  
  164. {$S Prefs}
  165.     function GetControls (dp: dialogPtr; first, count: integer): integer;
  166.         var
  167.             i: integer;
  168.     begin
  169.         GetControls := 0;
  170.         for i := 0 to count - 1 do
  171.             if GetControl(dp, first + i) then
  172.                 GetControls := i;
  173.     end;
  174.  
  175. {$S Prefs}
  176.     procedure SetPlanButton (dp: dialogPtr; enabled: boolean; vrn: integer; dirID: longInt; name: str63);
  177.         var
  178.             kind: integer;
  179.             hb, hs: handle;
  180.             r: rect;
  181.     begin
  182.         with dialog_prefs do begin
  183.             plan_enabled := enabled;
  184.             plan_vrn := vrn;
  185.             plan_dirID := dirID;
  186.             plan_name := name;
  187.         end;
  188.         GetDItem(dp, PFB_item, kind, hb, r);
  189.         GetDItem(dp, PFS_item, kind, hs, r);
  190.         if dirID = -1 then begin
  191.             SetCTitle(controlHandle(hb), GetGlobalString(pref_no_file));
  192.             HiliteControl(controlHandle(hs), 255);
  193.             SetCtlValue(controlHandle(hs), ord(enabled));
  194.         end
  195.         else begin
  196.             SetCTitle(controlHandle(hb), name);
  197.             HiliteControl(controlHandle(hs), 0);
  198.             SetCtlValue(controlHandle(hs), ord(enabled));
  199.         end;
  200.         prefs_dialog_dirty := true;
  201.     end;
  202.  
  203. {$S Prefs}
  204.     procedure SetDialog (dp: dialogPtr);
  205.     begin
  206.         dialog_prefs := prefs;
  207.         with prefs do begin
  208.             SetPlanButton(dp, plan_enabled, plan_vrn, plan_DirID, plan_name);
  209.             SetControl(dp, IPS_item, ShowIP);
  210.             SetControl(dp, AFS_item, autoopen);
  211.         end;
  212.         prefs_dialog_dirty := false;
  213.     end;
  214.  
  215. {$S Prefs}
  216.     procedure GetDialog (dp: dialogPtr);
  217.     begin
  218.         prefs := dialog_prefs;
  219.         with prefs do begin
  220.             plan_enabled := GetControl(dp, PFS_item);
  221.             showIP := GetControl(dp, IPS_item);
  222.             autoopen := GetControl(dp, AFS_item);
  223.         end;
  224.         prefs_dialog_dirty := false;
  225.     end;
  226.  
  227. {$S Prefs}
  228.     procedure OpenPreferences;
  229.     begin
  230.         if prefs_object <> nil then begin
  231.             if FrontWindow <> prefs_object.window then
  232.                 SelectWindow(prefs_object.window);
  233.         end
  234.         else begin
  235.             new(prefs_object);
  236.             prefs_object.Create(pref_dialog_id);
  237.         end;
  238.     end;
  239.  
  240. {$S Prefs}
  241.     procedure PrefsObject.Create (id: integer);
  242.     begin
  243.         UseResFile(app_resfile);
  244.         SetVersionParamText('', '');
  245.         inherited Create(id);
  246.         ok_item := Pref_Default_Item;
  247.         cancel_item := Pref_Cancel_Item;
  248.         SetUpDefaultOutline(window, Pref_Default_item, User_item);
  249.         SetDialog(window);
  250.         ShowWindow(window);
  251.     end;
  252.  
  253. {$S Prefs}
  254.     procedure Toggle (dp: dialogPtr; item: integer);
  255.     begin
  256.         prefs_dialog_dirty := true;
  257.         SetControl(dp, item, not GetControl(dp, item));
  258.     end;
  259.  
  260. {$S Prefs}
  261.     procedure PrefsObject.DoItem (item: integer);
  262.         procedure CheckClick (item: integer);
  263.         begin
  264.             SetControl(window, item, not GetControl(window, item));
  265.         end;
  266.         var
  267.             reply: MySFReply;
  268.             typeList: SFTypeList;
  269.             dfs: boolean;
  270.     begin
  271.         with prefs do begin
  272.             case item of
  273.                 IPS_item: 
  274.                     Toggle(window, IPS_item);
  275.                 AFS_item: 
  276.                     Toggle(window, AFS_item);
  277.                 PFS_item: 
  278.                     Toggle(window, PFS_item);
  279.                 PFB_item:  begin
  280.                     if dialog_prefs.plan_dirID <> -1 then
  281.                         SetSFFile(dialog_prefs.plan_vrn, dialog_prefs.plan_dirID);
  282.                     typeList[0] := 'TEXT';
  283.                     GetFile(nil, 1, typeList, reply);
  284.                     with reply do
  285.                         if Rgood then
  286.                             SetPlanButton(window, true, RvRefNum, RdirID, Rfname);
  287.                 end;
  288.                 Pref_Save_item, Pref_OK_item, Pref_Cancel_item:  begin
  289.                     if prefs_dialog_dirty and (item <> Pref_Cancel_item) then begin
  290.                         GetDialog(window);
  291.                         if item = Pref_Save_item then
  292.                             SaveDefaults;
  293.                     end;
  294.                     Destroy;
  295.                 end;
  296.                 otherwise
  297.                     ;
  298.             end;
  299.         end;
  300.     end;
  301.  
  302. {$S Prefs}
  303.     procedure PrefsObject.Destroy;
  304.     begin
  305.         inherited Destroy;
  306.         prefs_object := nil;
  307.     end;
  308.  
  309. {$S Prefs}
  310.     procedure PrefsObject.DoClose;
  311.         var
  312.             dp: dialogPtr;
  313.             sc: SCType;
  314.     begin
  315.         if prefs_dialog_dirty then begin
  316.             if FrontWindow <> window then
  317.                 SelectWindow(window);
  318.             sc := SaveChanges;
  319.             if sc = SCSave then begin
  320.                 GetDialog(window);
  321.                 SaveDefaults;
  322.             end;
  323.         end
  324.         else
  325.             sc := SCDiscard;
  326.         if sc <> SCCancel then begin
  327.             Destroy;
  328.         end;
  329.     end;
  330.  
  331. end.